package com.youlu.campus.service.sms;

import com.alibaba.fastjson.JSON;
import com.tencentcloudapi.common.exception.TencentCloudSDKException;
import com.tencentcloudapi.sms.v20210111.SmsClient;
import com.tencentcloudapi.sms.v20210111.models.SendSmsRequest;
import com.tencentcloudapi.sms.v20210111.models.SendSmsResponse;
import com.tencentcloudapi.sms.v20210111.models.SendStatus;
import com.tencentcloudapi.vms.v20200902.VmsClient;
import com.tencentcloudapi.vms.v20200902.models.SendTtsVoiceRequest;
import com.tencentcloudapi.vms.v20200902.models.SendTtsVoiceResponse;
import com.youlu.campus.config.TencentcloudApiConfig;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

/**
 * @author : [dengbo]
 * @className : VoiceUtil
 * @description : [语音验证码]
 * @createTime : [2022/5/9 14:59]
 */
@Slf4j
@Component
public class TencentcloudService {

    @Autowired
    private TencentcloudApiConfig tencentcloudApiConfig;

    @Autowired
    private VmsClient vmsClient;

    @Autowired
    private SmsClient smsClient;

    public boolean sendSms(String phone, String signName, String templateId, String[] templateParamSet) {
        try {
            SendSmsRequest req = new SendSmsRequest();
            //sms skd appId
//            req.setSmsSdkAppId(tencentcloudApiConfig.getSmsAppId());
            req.setSmsSdkAppId("1400487932");
            req.setSignName(signName);
            // 模版id
            req.setTemplateId(templateId);
            // 模板参数: 模板参数的个数需要与 TemplateId 对应模板的变量个数保持一致，若无模板参数，则设置为空
            req.setTemplateParamSet(templateParamSet);

            /* 下发手机号码，采用 E.164 标准，+[国家或地区码][手机号]
             * 示例如：+8613711112222， 其中前面有一个+号 ，86为国家码，13711112222为手机号，最多不要超过200个手机号 */
            String[] phoneNumberSet = new String[]{"+86" + phone};
            req.setPhoneNumberSet(phoneNumberSet);

            /* 用户的 session 内容（无需要可忽略）: 可以携带用户侧 ID 等上下文信息，server 会原样返回 */
            String sessionContext = "";
            req.setSessionContext(sessionContext);

            /* 短信码号扩展号（无需要可忽略）: 默认未开通，如需开通请联系 [腾讯云短信小助手] */
            String extendCode = "";
            req.setExtendCode(extendCode);

            /* 国际/港澳台短信 SenderId（无需要可忽略）: 国内短信填空，默认未开通，如需开通请联系 [腾讯云短信小助手] */
            String senderid = "";
            req.setSenderId(senderid);
            /* 通过 client 对象调用 SendSms 方法发起请求。注意请求方法名与请求对象是对应的
             * 返回的 res 是一个 SendSmsResponse 类的实例，与请求对象对应 */
            SendSmsResponse res = smsClient.SendSms(req);
            SendStatus[] result = res.getSendStatusSet();
            log.info("TencentcloudService sendSms result,request param:{},templateId:{},signName:{},templateParamSet:{},result:{}", phone, templateId, signName, templateParamSet, JSON.toJSONString(result));
            SendStatus re = result[0];
            if ("Ok".equals(re.getCode())) {
                return true;
            }
        } catch (TencentCloudSDKException e) {
            log.error("TencentcloudService sendSms error,request param:{},templateId:{},signName:{},templateParamSet:{}", phone, templateId, signName, templateParamSet, e);
        }
        return false;
    }

    public boolean sendVoice(String phone, String templateId, String[] templateParamSet) {
        try {
            SendTtsVoiceRequest req = new SendTtsVoiceRequest();

            // 模板 ID，必须填写在控制台审核通过的模板 ID，可登录 [语音消息控制台] 查看模板 ID
            //String templateId = "1396011";
            if (StringUtils.isNotBlank(templateId)) {
                req.setTemplateId(templateId);
            }

            // 模板参数，若模板没有参数，请提供为空数组
            req.setTemplateParamSet(templateParamSet);

            /* 被叫手机号码，采用 e.164 标准，格式为+[国家或地区码][用户号码]
             * 例如：+8613711112222，其中前面有一个+号，86为国家码，13711112222为手机号 */
            String calledNumber = "+86" + phone;
            req.setCalledNumber(calledNumber);

            // 在 [语音控制台] 添加应用后生成的实际SdkAppid，示例如1400006666
            req.setVoiceSdkAppid(tencentcloudApiConfig.getVoiceAppId());

            // 播放次数，可选，最多3次，默认2次
            Long playTimes = 2L;
            req.setPlayTimes(playTimes);

            // 用户的 session 内容，腾讯 server 回包中会原样返回
            String sessionContext = phone;
            req.setSessionContext(sessionContext);

            /* 通过 client 对象调用 SendTtsVoice 方法发起请求。注意请求方法名与请求对象是对应的
             * 返回的 res 是一个 SendTtsVoiceResponse 类的实例，与请求对象对应 */
            SendTtsVoiceResponse res = vmsClient.SendTtsVoice(req);
            log.info("TencentcloudService sendVoice result,request param:{},templateId:{},templateParamSet:{},result:{}", phone, templateId, JSON.toJSONString(res));
            return true;
        } catch (TencentCloudSDKException e) {
            log.error("TencentcloudService sendVoice error,request param:{},templateId:{},templateParamSet:{}", phone, templateId, JSON.toJSONString(templateParamSet), e);
        }
        return false;
    }

}

